package com.example.site.service.impl;

import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.site.entity.Order;
import com.example.site.entity.OrderJoinType;
import com.example.site.entity.OrderJoinTypeAndUser;
import com.example.site.entity.Room;
import com.example.site.enums.OrderStatus;
import com.example.site.service.OrderService;
import com.example.site.mapper.OrderMapper;
import com.example.site.vo.PageVO;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.Map;
import java.util.Objects;

/**
 * @author haoka
 * @description 针对表【hotel_order】的数据库操作Service实现
 * @createDate 2023-04-12 21:30:16
 */
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order>
        implements OrderService {

    @Resource
    OrderMapper orderMapper;

    public SaResult createOrder(Order order) {
        Integer userId = StpUtil.getLoginIdAsInt();
        order.setUserId(userId);
        order.setStatus(OrderStatus.WAITING);
        order.setCreateTime(new Date());

        if (this.save(order)) {
            return SaResult.ok();
        } else {
            return SaResult.error("预约失败");
        }
    }
//    这是一个Java类，名为OrderServiceImpl。它实现了OrderService接口，并继承自ServiceImpl<OrderMapper, Order>类。其中，@Service注解表示该类是一个服务类。
//
//    该类包含一个createOrder方法，该方法将传入一个Order对象，为该对象设置用户ID、订单状态（Waiting）、创建时间，并将其保存到数据库中。如果保存操作成功，则返回“ok”，否则返回一个错误消息，说明失败的原因。
//
//    在方法中，使用了StpUtil.getLoginIdAsInt()方法获取当前登录用户的ID，并将该ID设置为该订单所属的用户ID。同时，使用了this.save(order)方法保存订单信息到数据库中。由于该类继承自BaseService类，并且指定了OrderMapper和Order作为泛型类型，因此可以使用this.save方法来执行数据持久化操作，无需手动编写SQL语句。

    /**
     * 获取我的所有订单
     *
     * @return
     */
    public SaResult getMyOrderJoinType() {
        Integer userId = StpUtil.getLoginIdAsInt();

        String _page = "1";
        String _page_size = "999";
        Page<OrderJoinType> page = new Page<>(Integer.parseInt(_page), Integer.parseInt(_page_size));

        QueryWrapper<Order> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id", userId);
        queryWrapper.orderByDesc("id");

        orderMapper.selectPageOrderJoinType(page, queryWrapper);
        PageVO<OrderJoinType> pageVO = new PageVO<>(page);
        return SaResult.data(pageVO);
    }

    /**
     * 获取我的所有订单
     *
     * @return
     */
    public SaResult getMyOrder() {
        Integer userId = StpUtil.getLoginIdAsInt();
        LambdaQueryWrapper<Order> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(Order::getUserId, userId);
        return SaResult.data(this.list(lambdaQueryWrapper));
    }


    /**
     * 获取所有订单
     *
     * @return
     */
    public SaResult getAll(Map<String, String> data) {

        String _page = data.get("page");
        String _page_size = data.get("page_size");
        Page<OrderJoinType> page = new Page<>(Integer.parseInt(_page), Integer.parseInt(_page_size));

        QueryWrapper<Order> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByDesc("id");

        orderMapper.selectPageOrderJoinType(page, queryWrapper);
        PageVO<OrderJoinType> pageVO = new PageVO<>(page);
        return SaResult.data(pageVO);
    }

    /**
     * @param id
     * @return
     * @deprecated 取消订单
     */
    public SaResult cancelOrder(Integer id) {
        Integer userId = StpUtil.getLoginIdAsInt();
        Order order = this.getById(id);
        if (order != null) {
            if (!Objects.equals(order.getUserId(), userId)) {
                return SaResult.error("这不是您的预定信息");
            } else {
                if (order.getStatus() != OrderStatus.WAITING) {
                    return SaResult.error("当前状态已无法取消");
                } else {
                    order.setStatus(OrderStatus.CANCEL);
                    this.updateById(order);
                    return SaResult.ok();
                }
            }
        } else {
            return SaResult.error("没有找到该条预定信息");
        }
    }

    public SaResult getListJoinTypeAndUser(Map<String, String> data) {
        String _page = data.get("page");
        String _page_size = data.get("page_size");
        Page<OrderJoinTypeAndUser> page = new Page<>(Integer.parseInt(_page), Integer.parseInt(_page_size));

        QueryWrapper<Order> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByDesc("id");

        orderMapper.selectPageOrderJoinTypeAndUser(page, queryWrapper);
        PageVO<OrderJoinTypeAndUser> pageVO = new PageVO<>(page);
        return SaResult.data(pageVO);
    }
//    这段代码是一个Java方法，用于获取包含OrderJoinTypeAndUser对象的列表，并将其作为SaResult对象返回。
//    在方法中，首先从输入参数data中获取键名为"page"和"page_size"的值，然后使用这两个值创建了一个新的分页对象Page<OrderJoinTypeAndUser>。该对象将会用于后面的分页查询操作。
//    接着创建一个QueryWrapper<Order>对象queryWrapper，并设置按照"id"字段降序排列的排序规则。
//    然后调用orderMapper对象的selectPageOrderJoinTypeAndUser()方法，该方法传入之前创建的分页对象和查询条件对象，从数据库中获取数据并填充到分页对象page中。
//    最后，将填充完毕的分页对象page传入PageVO<OrderJoinTypeAndUser>对象的构造函数中，并用PageVO对象创建一个新的SaResult对象并返回。


    public SaResult setStatus(Map<String, String> data) {
        String id = data.get("id");
        String status = data.get("status");
        Order order = this.getById(id);
        order.setStatus(OrderStatus.valueOf(status));
        this.updateById(order);
        return SaResult.ok();
    }
    //这是一个 Java 方法，用于设置系统中订单的状态。
    //方法接收一个包含订单ID和新状态值的键值对数据Map作为输入。方法通过调用 getById 方法获取具有指定ID的订单对象，然后使用 setStatus 方法和 OrderStatus 枚举（可能在其他地方定义）来设置该订单的状态。最后，方法通过调用 updateById 方法更新系统中的订单信息。
    //方法返回一个 SaResult 对象，其状态为 “ok”，表示更新成功。
}




